package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import java.text.Collator;
import java.util.Locale;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.DisciplinaBD;

public class DisciplinaDAO {
    
    //Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Metodos auto incremento, unique.
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDDisciplina;
    ResultSet rs;
    
    //Utilizada para comparar strings
    Collator collator = Collator.getInstance (new Locale ("pt", "BR"));
    
    public int autoIncremento(){
        return metBD.autoIncremento("disciplina", "cod_dis");
    }
    
    public boolean inserirDisciplina(DisciplinaBD dis){
        try
        {
            Connection con = conBD.conectar();
            
            boolean vnome;
            
            //verifica nome duplicado => False: Está duplicado, True: Não duplicado
            vnome = metBD.unique("disciplina", "nome_dis", dis.getNome());
            
            if(vnome){                          
                BDDisciplina = con.createStatement();

                BDDisciplina.execute("INSERT INTO disciplina VALUES "
                        + " ('"+dis.getCodigo()+"', '"+dis.getNome()+"', "
                        + " '" +dis.getCargahoraria()+ "', '" +dis.getTipodisciplina()+ "', "
                        + " '" +dis.getCreditos() + "' , '" +dis.getCodArea()+ "');");

                JOptionPane.showMessageDialog(null,
                        "Cadastro realizado com sucesso", 
                        "cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;  
            
            }else{
                 JOptionPane.showMessageDialog(null,"Disciplina já existe", 
                        "Nome duplicado no banco de dados", 
                        JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;               
            }
    
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,ex.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }         
        return false;
    }
    
    public List<DisciplinaBD> filtro(String campo, String valor) {      
        List<DisciplinaBD> listaDisciplina = new ArrayList<DisciplinaBD>();  
        try { 
            Connection con = conBD.conectar();          
            BDDisciplina = con.createStatement();

            //Selecionar as linhas que batem com o valor desejado
            rs = BDDisciplina.executeQuery("SELECT d.cod_dis, d.nome_dis, "
                    + " d.cargahoraria_dis, d.tipo_dis, d.credito_dis, ar.cod_area, ar.nome_area "
                    + " from disciplina d, area ar "
                    + " where d.cod_area = ar.cod_area and "
                    + " "+campo+" like '"+ valor +"%' "
                    + " order by (d.cod_dis) ");

            if (rs != null) { 
                while (rs.next()) { //setar os dados correspondentes
                    DisciplinaBD db = new DisciplinaBD();
                    db.setCodigo(rs.getInt("d.cod_dis"));
                    db.setNome(rs.getString("d.nome_dis"));
                    db.setCargahoraria(rs.getInt("d.cargahoraria_dis"));                       
                    db.setTipodisciplina(rs.getString("d.tipo_dis"));
                    db.setCreditos(rs.getInt("d.credito_dis"));
                    db.setCodArea(rs.getInt("ar.cod_area"));
                    db.setNomeArea(rs.getString("ar.nome_area"));
                    listaDisciplina.add(db); 
                }
                con.close();
                return listaDisciplina; 
            }else{ 
                con.close();
                return null; 
            }           
        }catch (SQLException e) { 
            return null; 
        } 
    }
    
    public boolean alterarDisciplina(DisciplinaBD ds){
        String sql = "update disciplina set nome_dis = ?,cargahoraria_dis = ?,"
                + " tipo_dis = ?, credito_dis = ?, cod_area = ? ";
        sql += " where cod_dis = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
            
            //Obtem o nome da disciplina e compara com o  
            //que foi ENVIADO para alteração (cr.get = o que o usuario digitou)
            // SELECT ira obter o atual para aquele codigo
            BDDisciplina = con.createStatement();
            rs = BDDisciplina.executeQuery("SELECT nome_dis from disciplina "
                            + " where cod_dis = '"+ds.getCodigo()+"'");
            rs.first();
            String capturaNome = rs.getString("nome_dis");
            
            //seta o nível de diferença quando forem comparadas
            collator.setStrength(Collator.PRIMARY);

            if(metBD.unique("disciplina", "nome_dis", ds.getNome()) || collator.compare(capturaNome, ds.getNome()) == 0){ // Deixa Cadastrar se usuario manteve o mesmo nome
                PreparedStatement ps = con.prepareStatement(sql);
                
                ps.setString(1, ds.getNome());
                ps.setString(2, (String.valueOf(ds.getCargahoraria())));
                ps.setString(3, ds.getTipodisciplina());
                ps.setString(4, (String.valueOf(ds.getCreditos())));
                ps.setString(5, (String.valueOf(ds.getCodArea())));
                ps.setString(6, (String.valueOf(ds.getCodigo())));

                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,
                            "Alteração realizada com sucesso", 
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }            
            }
            else{               
                JOptionPane.showMessageDialog(null,"Disciplina já existe",
                        "Nome duplicado", JOptionPane.INFORMATION_MESSAGE);
                return false;           
            }           
        }catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }   
    }

    public boolean excluirDisciplina(DisciplinaBD ds){
        String sql = "delete from disciplina where cod_dis = ?";
        try {
            Connection con = conBD.conectar();
            
            //Verifica se disciplina que foi ENVIADO esta associada a algum curso
            BDDisciplina = con.createStatement();
            rs = BDDisciplina.executeQuery("SELECT count(cod_dis) from turmadisciplina "
                    + "where cod_dis = '"+ds.getCodigo()+"' ");
            rs.last();
            int capturaCurso= rs.getInt(1);
            
            if(capturaCurso >= 1){ //Possui FK's?
                    JOptionPane.showMessageDialog(null,"Disciplina esta ligado a turma,"
                            + " não pode ser excluída", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);   
                con.close();
                return false;              
            }
            else{
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(ds.getCodigo())));
                if (ps.executeUpdate() > 0) {
                    return true;
                } else {
                    return false;
                }
           }
       
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   }
    
     public List<DisciplinaBD> carregarCombo(){
        List<DisciplinaBD> listaDisciplina = new ArrayList<DisciplinaBD>();//lista para Codigo + nome
        try
        {
            Connection con = conBD.conectar(); 
            BDDisciplina = con.createStatement();
                   
            rs = BDDisciplina.executeQuery("SELECT cod_dis, nome_dis "
                    + " from disciplina order by(cod_dis)");
            
            DisciplinaBD selecioneDisciplina = new DisciplinaBD();
            selecioneDisciplina.setCodigo(-1);
            selecioneDisciplina.setNome("-- Selecione uma disciplina --");
            listaDisciplina.add(selecioneDisciplina);

            while(rs.next()){
                DisciplinaBD ds = new DisciplinaBD();
                ds.setCodigo(rs.getInt("cod_dis"));
                ds.setNome(rs.getString("nome_dis"));
                listaDisciplina.add(ds);
            }  
            con.close();  
            return listaDisciplina;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no vanco", JOptionPane.ERROR_MESSAGE);
        }
        return listaDisciplina;
    }

   public List<DisciplinaBD> carregarComboPorArea(String nomeArea){
        List<DisciplinaBD> listaDisciplina = new ArrayList<DisciplinaBD>();//lista para Codigo + nome
        try
        {
            Connection con = conBD.conectar(); 
            BDDisciplina = con.createStatement();
            
            //resgatar codigo da area a partir do nome             
            rs = BDDisciplina.executeQuery("SELECT cod_area from area "
                    + " where nome_area = '"+nomeArea+"' ");
            rs.last();
            int capturaCodigo = rs.getInt("cod_area");
                   
            rs = BDDisciplina.executeQuery("SELECT cod_dis, nome_dis "
                    + " from disciplina where "
                    + " cod_area  = '"+capturaCodigo+"' ");

            while(rs.next()){
                DisciplinaBD ds = new DisciplinaBD();
                ds.setCodigo(rs.getInt("cod_dis"));
                ds.setNome(rs.getString("nome_dis"));
                listaDisciplina.add(ds);
            }  
            con.close();  
            return listaDisciplina;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no vanco", JOptionPane.ERROR_MESSAGE);
        }
        return listaDisciplina;
    }
   
   public List<DisciplinaBD> carregarComboPorTurma(int codTurma){
        List<DisciplinaBD> listaDisciplina = new ArrayList<DisciplinaBD>();//lista para Codigo + nome
        try
        {
            Connection con = conBD.conectar(); 
            BDDisciplina = con.createStatement();
                               
            rs = BDDisciplina.executeQuery("SELECT td.cod_dis, d.nome_dis "
                    + " FROM turmadisciplina td, disciplina d "
                    + " WHERE td.cod_dis = d.cod_dis and "
                    + " td.cod_turma = '"+codTurma+"' ");

            while(rs.next()){
                DisciplinaBD ds = new DisciplinaBD();
                ds.setCodigo(rs.getInt("td.cod_dis"));
                ds.setNome(rs.getString("d.nome_dis"));
                listaDisciplina.add(ds);
            }  
            con.close();  
            return listaDisciplina;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no vanco", JOptionPane.ERROR_MESSAGE);
        }
        return listaDisciplina;
    }
    
}
